package khs.java_icu4j_charset.main.java;

import java.io.UnsupportedEncodingException;

import com.ibm.icu.text.CharsetDetector;
import com.ibm.icu.text.CharsetMatch;

/**
 * Hello world!
 *
 */
public class App 
{
    public static String bytesToHexString(byte[] bytes){
        StringBuilder sb = new StringBuilder();
        for(byte b : bytes){
            sb.append(String.format("%02x ", b&0xff));
        }
        return sb.toString();
    }
    
    public static void main( String[] args ) throws UnsupportedEncodingException
    {
        // 자바의 new String은 해당 인코딩된 byte를 두번째 인자의 인코딩에서 기본 인코딩인 UTF-8로 변환 후 저장하게 된다.
        // 결국 UTF-8의 String 형이 된다.
        // 자바는 인코딩을 하려면 String이 정상적인 UTF-8코드 문자열을 가져야한다.
        
        // icu는 EUC-KR을 정확하게 집어내지 못하는거 같다.
        // 따라서 UTF-8인지 아닌지만 구별하는 용도로 사용하는것이 좋을듯....
        
        CharsetDetector charsetDetector = new CharsetDetector();
        CharsetMatch charsetMatch;
        
        String str = "가나";
        byte[] strBuffer = str.getBytes("UTF-8");
        charsetDetector.setText(strBuffer);
        
        // maby can be null
        charsetMatch = charsetDetector.detect();
        String encoding = charsetMatch.getName();
        System.out.println(bytesToHexString(strBuffer));
        System.out.printf("%s: %s\n", str, encoding);
        
        // EUC-KR 인코딩
        byte[] encodeBuffer = str.getBytes("EUC-KR");
        String encodedStr = new String(encodeBuffer, "EUC-KR");
        charsetDetector.setText(encodeBuffer);
        
        charsetMatch = charsetDetector.detect();
        String encodedEncoding = charsetMatch.getName();
        
        System.out.println(bytesToHexString(encodeBuffer));
        System.out.printf("%s: %s\n", encodedStr, encodedEncoding);
        
        // UTF-8 인코딩
        byte[] reEncodedBuffer = encodedStr.getBytes("UTF-8");
        String reEncodedStr = new String(reEncodedBuffer);
        charsetDetector.setText(reEncodedBuffer);
        
        charsetMatch = charsetDetector.detect();
        String reEncodedEncoding = charsetMatch.getName();
        
        System.out.println(bytesToHexString(reEncodedBuffer));
        System.out.printf("%s: %s", reEncodedStr, reEncodedEncoding);
    }
}
